/**
 * 
 */
package com.feib.soeasy.service;

import java.util.List;

import org.springframework.transaction.annotation.Transactional;

import com.feib.soeasy.dao.UserDao.ROLE_CONSTRAINT;
import com.feib.soeasy.model.Group;
import com.feib.soeasy.model.User;
import com.feib.soeasy.pagination.PaginatedList;

/**
 * @author Jimmy Liu
 * 
 */
@Transactional(readOnly = true)
public interface UserService
{

    /**
     * 登入帳號是否重複，不管 locked or enabled 與 expiredDate
     * 
     * @param userId
     *            登入帳號
     * @param groupNo
     *            群組/帳單業者代號
     * @return
     */
    public boolean isDuplicateUserId(String userId, String groupNo);

    /**
     * 新增使用者
     * 
     * @param user
     * @return
     */
    @Transactional(readOnly = false)
    public User addUser(User user);

    /**
     * 更新User Object
     * 
     * @param user
     * @return
     */
    @Transactional(readOnly = false)
    public User saveUser(User user);

    /**
     * 以登入帳號取得使用者資訊
     * 
     * @param userId
     *            登入帳號
     * @param groupNo
     *            群組/帳單業者代號
     * @return
     */
    public User queryByUerIdGroupNo(String userId, String groupNo);

    /**
     * 
     * @param userId
     * @param userName
     * @param groupNo
     * @param roleNo
     * @param role_constraint
     * @param paginationConfig
     * @return
     */
    @Deprecated
    public PaginatedList<User> queryUserPaginationByRole(	String userId,
                    String userName,
                    String groupNo,
                    ROLE_CONSTRAINT role_constraint,
                    String roleNo,
                    PaginatedList<User> paginationConfig);

    /**
     * 以登入帳號取得使用者資訊，登入Method 使用
     * 
     * @param userId
     *            登入帳號
     * @param groupNo
     *            群組/帳單業者代號
     * @return
     */
    public User loginByUerIdGroupNo(String userId, String groupNo);

    /**
     * 以始用者主鍵取得使用者資訊
     * 
     * @param userPk
     *            登入帳號主鍵
     * @return
     */
    public User queryByUerPk(Long userPk);

    /**
     * 查詢所有的使用者
     * 
     * @return
     */
    public List<User> getAllUser();

    /**
     * 
     * @param groupNo
     * @return
     */
    public List<User> findUserByGroupNo(String groupNo);

    /**
     * 啟用使用者帳號(set enabled property to TRUE)
     * 
     * @param userId
     *            登入帳號
     * @param groupNo
     *            群組/帳單業者代號
     * @return
     * @throws UserIdNotFoundException
     */
    @Transactional(readOnly = false)
    public User enableUser(String userId, String groupNo) throws UserIdNotFoundException;

    /**
     * 啟用使用者帳號(set enabled property to TRUE)
     * 
     * @param userPk
     *            登入帳號主鍵
     * @return
     */
    @Transactional(readOnly = false)
    public User enableUser(Long userPk);

    /**
     * 停用使用者帳號(set enabled property to FALSE)
     * 
     * @param userId
     *            登入帳號
     * @param groupNo
     *            群組/帳單業者代號
     * @return
     * @throws UserIdNotFoundException
     */
    @Transactional(readOnly = false)
    public User disableUser(String userId, String groupNo) throws UserIdNotFoundException;

    /**
     * 停用使用者帳號(set enabled property to FALSE)
     * 
     * @param userPk
     *            登入帳號主鍵
     * @return
     */
    @Transactional(readOnly = false)
    public User disableUser(Long userPk);

    /**
     * 鎖定使用者帳號(set locked property to FALSE)
     * 
     * @param userId
     *            登入帳號
     * @param groupNo
     *            群組/帳單業者代號
     * @return
     * @throws UserIdNotFoundException
     */
    @Transactional(readOnly = false)
    public User lockUser(String userId, String groupNo) throws UserIdNotFoundException;;

    /**
     * 鎖定使用者帳號(set locked property to FALSE)
     * 
     * @param userPk
     *            登入帳號主鍵
     * @return
     */
    @Transactional(readOnly = false)
    public User lockUser(Long userPk);

    /**
     * 解鎖定使用者帳號(set locked property to FALSE)
     * 
     * @param userId
     *            登入帳號
     * @param groupNo
     *            群組/帳單業者代號
     * @return
     * @throws UserIdNotFoundException
     */
    @Transactional(readOnly = false)
    public User unLockUser(String userId, String groupNo) throws UserIdNotFoundException;;

    /**
     * 解鎖定使用者帳號(set locked property to FALSE)
     * 
     * @param userPk
     *            登入帳號主鍵
     * @return
     */
    @Transactional(readOnly = false)
    public User unLockUser(Long userPk);


    /**
     * 查詢帳單業者的使用者資料
     * 
     * @param groupNo 業者代號，一定要有，完全比對
     * @param userId 使用者帳號
     * @param userName 使用者名稱
     * @param paginationConfig 分頁條件
     * @return
     */
    public PaginatedList<User> findPaginationUsers(String groupNo, String userId, String userName, PaginatedList<User> paginationConfig);
    
    /**
     * 以業者代號查詢ADMINISTRATOR的USER
     * @param groupNo 業者代號，一定要有
     * @param paginationConfig 分頁條件
     * @return
     */
    public PaginatedList<User> findPaginationForAdministratorByGroupNo(String groupNo, PaginatedList<User> paginationConfig);

    /**
     * @param editGroup
     * @return
     */
    public int countUserByGroupExcludeAdmin(Group group);
}
